package com.cn.zpark;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

/**
 * @PackageName: com.cn.zpark
 * @ClassName: Dom4jAnalysisXML
 * @Description:
 * @author: RZS
 * @date: 2022/4/2  15:21
 */
public class Dom4jAnalysisXML {
    /*
     * 使用dom4j解析xml的大致步骤
     * 1.创建SAXReader
     * 2.使用SAXReader读取xml文档并且生成Document对象。
     * 	  这一步也是dom解析耗资源的地方，因为首先要先将文档所有数据读取完毕，并且以一个Document对象
     * 	  的形式保存在内存当中
     * 3.通过Document对象获取根元素
     * 4.按照xml文档的结构从根元素开始逐级遍历xml文档数据的目的
     */
    public static void main(String[] args) throws Exception {
        // 1.创建SAXReader
        SAXReader reader = new SAXReader();
        // 获取XML文件路径
        String path = Dom4jAnalysisXML.class.getClassLoader().getResource("web.xml").getPath();
        System.out.println(path);
        // 2.使用SAXReader读取xml文档并且生成Document对象。
        /*
         * Document提供了获取根元素的方法：Element getRootElement()
         *
         * 而element的每一个实例用于表示当前xml文件的一个元素（一对标签），它提供了获取
         * 其元素相关的方法：
         * 获取当前标签的名字：String getName()
         * 获取当前标签中间的文本：String getText()
         * 获取当前标签下指定名字的子标签：Element element(String name)
         * 获取当前标签下的所有子标签：List elements()
         * 获取当前标签下指定名字的子标签：List elements(String name)
         *
         * 获取当前标签下指定名字标签的属性：Attribute attribute(String name)
         * Attribute的每一个实例表示一个属性，它有两个方法：
         * 获取属性名：String getName()
         * 获取属性值：String getValue()
         */
        Document document = reader.read(path);
        // 3.通过Document对象获取根元素
        Element rootElement = document.getRootElement();
        // 获取根标签下的所有子标签
        List<Element> elements = rootElement.elements();
        // 循环取出跟标签下的所有子标签
        for (Element element : elements) {
            // 获取子标签的名字
            System.out.println("子标签名字：" + element.getName());
            // 获取子标签的属性
            Attribute attribute = element.attribute("zdy");
            System.out.println("当前子标签的属性值为：" + attribute.getValue());

            // 获取子标签下的所有子标签
            List<Element> els = element.elements();
            // 循环取出子标签下的所有子标签
            for (Element el : els) {
                System.out.println(el.getName() + ":  " + el.getTextTrim());
            }
            System.out.println("----------------------------");
        }

    }
}
